#include<iostream>

//类模板:类的成员变量变成了参数
template<typename T>
class DynamicArray
{
public:
    DynamicArray()
    {
        
        capacity=10;
        size=0;
        array=new T[capacity];
    }
    ~DynamicArray();
    void Insert(const T &element)
    {
        if(size==capacity)
        {
            capacity*=2;
            T*newP=new T[capacity];
            for(int i=0;i<size;i++)
            {
                newP[i]=array[i];

            }
            delete array;
            array=newP;
        }
        array[size++]=element;
    }
    // void show()
    // {
    //     for (int i = 0; i < size; i++)
    //     {
    //         std::cout<<array[i]<<" ";
    //     }
    //     std::cout<<std::endl;
    // }
    //类模板的友元函数在类中声明需要声明 ，友元函数的模板类名不能跟类中相同
    template<typename T1>
    friend std::ostream&operator <<(std::ostream& os,const DynamicArray<T1>&a);
    DynamicArray<T>& operator=(const DynamicArray<T>&a)
    {
        delete[] array;
        size= a.size;
        capacity=a.capacity;
        array=new T[capacity];
        for (int i = 0; i < size; i++)
        {
            array[i]=a.array[i];
        }
        return *this;
    }
private:
    T*array;
    int capacity;
    int size;
};
template<typename T>
DynamicArray<T>::~DynamicArray()
{
    std::cout<<"析构函数";
    delete[] array;
}
template<typename T1>
std::ostream&operator <<(std::ostream& os,const DynamicArray<T1>&a)
{
    for(int i=0;i<a.size;i++)
    {
        os<<a.array[i]<<" ";

    }
    os<<std::endl;
    return os;
}

int main()
{   //类模板单独定义只能显示调用
    DynamicArray<int>  a;
    for(int i=0;i<20;i++)
    {
        a.Insert(i+1);
    }
    DynamicArray<DynamicArray<int>>  b;
    for(int i=0;i<2;i++)
    {
        b.Insert(a);
    }
    std::cout<<b<<std::endl;
    return 0;
    
}

